Отображение прогресса длительных операций в 8.3.10 (и более ранних версиях)

При разработке прикладного решения большую роль играет функциональность. Но для достижения коммерческого успеха не менее важна дружелюбность интерфейса или эргономичность. И в этой статье мы осветим важный момент эргономики – информирование пользователя о ходе длительного процесса.

Данный материал будет полезен и начинающим программистам 1С, и тем, кто хочет сделать свои разработки удобнее для пользователей. Кроме того, рассмотрим некоторые новшества платформы 8.3.10.

Начнём с того, что условимся о некоторых ограничениях:

  • В статье рассматриваются концепции. Поэтому за рамками останутся решения, основанные на библиотеках / внешних компонентах
  • Примеры, приведённые в статье, не претендуют на «Единственно-верное-решение».

В статье последовательно будет рассмотрено: как было в обычных формах, что случилось с приходом управляемых форм и какие сюрпризы нам преподнесла платформа 8.3.10.

Итак, давайте приступим.

Думаю, никого не требуется убеждать, что информирование о ходе выполнения длительного процесса в программе очень важно. Каждый пользователь может привести примеры, когда смотришь в экран и думаешь – «перезагружать не надо ждать» (пишите в комментариях – где вы предпочитаете ставить запятую).

И платформа «1С:Предприятие 8» в этом не исключение – в ней для отображения хода процесса имеется специальный элемент обычных форм «Индикатор» (или вид поля управляемой формы «Поле индикатора»). Давайте рассмотрим нюансы его использования.

Обычные формы

Придумать что-то проще, чем вывод индикатора выполнения процесса в обычных формах – сложная задача. А всё это благодаря тому, что в режиме толстого клиента в «1С:Предприятие 8» по умолчанию отсутствуют границы между клиентской частью и серверной частью. То есть выполнение программного кода и интерфейсных методов происходит, как правило, в одном контексте. Поэтому у разработчика не возникает необходимости задумываться о доступности необходимых свойств, процедур и функций.

Схематично работу «1С:Предприятие» в толстом клиенте можно представить следующим образом:

Рисунок 1. Схема работы «1С:Предприятие» в режиме толстого клиента

В обычном режиме клиентский сеанс открывает постоянное соединение с базой данных, а выполнение программного кода на встроенном языке преимущественно происходит на стороне клиента.

В связи с этим в любой строчке кода, описывающего длительный процесс, можно оценить объем обработанных данных, получить процент его выполнения и поместить полученное значение в реквизит формы, связанный с выведенным на форму элементом «Индикатор». В этот момент пользователь увидит графическое изменение отображения полосы индикатора в интерфейсе – опять же, благодаря тому, что всё действие происходит на клиенте.

Самый простой «длительный процесс» с выводом процента выполнения в обычном режиме может выглядеть следующим образом:

Процедура КнопкаВыполнитьНажатие(Кнопка) КоличествоОбходов = 100500; Для Инд = 0 По КоличествоОбходов Цикл //такая вот нехитрая эмуляция длительной операции Индикатор = Инд*100/КоличествоОбходов; КонецЦикла; КонецПроцедуры
Рисунок 2. Обычные формы – пример длительной операции с выводом процента выполнения в индикатор

Как говорится – «проще не придумаешь». Никакого «лишнего» кода, всё максимально прозрачно, понятно и самое главное – работает!

На этом моменте кто-то из читателей ностальгично вздохнёт, так как мы переходим к следующей части статьи – к управляемым формам.

Управляемые формы

С приходом платформы 8.2 и управляемых форм ситуация с индикатором в корне изменилась. Но дело совсем не в версии платформы и не в новых формах, а в появлении новых видов клиентов для «1С:Предприятие» – тонкого и web-клиента. Схематично работу в управляемом режиме можно представить в следующем виде:

Рисунок 3. Схема работы «1С:Предприятие» в управляемом режиме

Если провести сравнение с обычным режимом, то сразу бросаются следующие отличия:

  • Постоянного соединения клиентской части с базой данных нет – их взаимодействие происходит только через сервер 1С (в файловом режиме вместо сервера 1С выступает некоторая эмуляция, но это уже другая история)
  • Отсутствует постоянное соединение клиентской части с серверной
  • Встроенный язык разделён на клиентский и серверный.

Есть ещё один важный, но не отображённый на схеме нюанс – серверный вызов, посредством которого происходит взаимодействие клиентской части и серверной. Он может быть инициирован только клиентом. А это значит, что со стороны сервера отправить данные на сторону клиента можно только в том случае, если с соответствующего клиентского сеанса пришёл запрос.

Дополнительно о серверных вызовах можно прочитать в статье Как работает серверный вызов в 1С

Как всё это повлияло на использование индикатора для отображения информации о ходе выполнения длительного процесса? Давайте подробно в этом разберёмся.

Обычно длительный процесс заключается в сложной обработке данных. Будь то групповое проведение документов, проведение сложных расчётов или выборка данных и заполнение ими отчётной формы.

Получается, что в том или ином виде всегда требуется доступ к базе данных и/или выполнение методов, доступных только на стороне сервера. Для этого на него необходимо передать управление.

Во время выполнения серверного вызова клиентская часть 1С становится неактивной и блокируется для дальнейшей работы до тех пор, пока вызов не завершится и управление не вернётся на сторону клиента. Поэтому, даже если во время выполнения процедуры на сервере производить изменение значения реквизита, отвечающего за данные индикатора, то на клиент вернётся только финальная величина.

Получается, что если взять код из предыдущего примера и просто разбить его на клиентскую и серверную часть, то получим долгое подвисание приложения, после чего индикатор резко установится в значение «100%».

&НаСервере Процедура КомандаВыполнитьНажатиеНаСервере() КоличествоОбходов = 100500; Для Инд = 0 По КоличествоОбходов Цикл //такая вот нехитрая эмуляция длительной операции Индикатор = Инд*100/КоличествоОбходов; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура КомандаВыполнитьНажатие(Команда) КомандаВыполнитьНажатиеНаСервере(); КонецПроцедуры
Рисунок 4. Попытка использовать код из обычного режима в управляемом

При таком использовании индикатора от него пользы никакой нет. Поэтому разработчики идут на различные хитрости – выполняют длительные процессы «порционно» с отображением на полосе индикатора значений относительно «порций»; используют динамическое уменьшение скорости движения индикатора в зависимости от времени выполнения процесса; или придумывают другие варианты. Но ни один из них не имеет ничего общего с отображением выполнения конкретного процесса в режиме реального времени.

Именно поэтому при обновлении типовых конфигураций рядом с индикатором мы наблюдаем фразу примерно следующего содержания: «эта операция может занять длительное время – от нескольких минут до нескольких часов». И отчасти поэтому при формировании отчётов крутятся «безликие» круги-индикаторы, которые в виде простой анимации указывают на то, что программа вовсе не зависла.

Кстати, в «1С:Бухгалтерии предприятия, ред. 3.0» разработчики нашли интересное решение (видимо, чтобы бухгалтеры не скучали) – вместо кругов разместили милого котёнка.

Не знаю, как на счет настроения, но понимания о планируемом времени окончания выполнения процесса этот котёнок точно не прибавляет.

Один из вариантов вывода индикатора для отображения хода выполнения длительного процесса заключается в следующем:

  1. Длительная операция запускается в виде фонового задания, в ходе выполнения которого промежуточные результаты помещаются во временное хранилище.
  2. На стороне клиента запускается обработчик ожидания, который с определённой периодичностью опрашивает временное хранилище и выводит данные из него в полосу индикатора.

Программный код будет состоять из двух частей: из кода интерфейсной части (в нашем случае – обработки) и кода общего модуля. Модуль формы обработки будет выглядеть примерно так:

&НаКлиенте Процедура КомандаВыполнитьНажатие(Команда) //стартуем выполнение длительной операции на сервере в фоновом задании КомандаВыполнитьНажатиеНаСервере(); //подключаем обработчик ожидания для мониторинга выполнения процесса ПодключитьОбработчикОжидания("ОбработчикОжидания",5,Истина); КонецПроцедуры &НаСервере Процедура КомандаВыполнитьНажатиеНаСервере() АдресХранилища = ПоместитьВоВременноеХранилище( Новый Структура("Инд,КоличествоОбходов",0,1),ЭтаФорма.УникальныйИдентификатор); МассивПараметров = Новый Массив; МассивПараметров.Добавить(АдресХранилища); ФЗ = ФоновыеЗадания.Выполнить("ОбщийМодуль1.ФоновыйПроцесс",МассивПараметров); КонецПроцедуры &НаКлиенте Процедура ОбработчикОжидания() Экспорт ДанныеОВыполнении = ПолучитьИзВременногоХранилища(АдресХранилища); Если ТипЗнч(ДанныеОВыполнении) = Тип("Структура") Тогда Индикатор = ДанныеОВыполнении.Инд*100/ДанныеОВыполнении.КоличествоОбходов; Если ДанныеОВыполнении.Инд <> ДанныеОВыполнении.КоличествоОбходов Тогда ПодключитьОбработчикОжидания("ОбработчикОжидания",5,Истина); КонецЕсли; КонецЕсли; КонецПроцедуры
Рисунок 5. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Модуль формы обработки

А общий модуль будет содержать процедуру для запуска в фоновом режиме:

//Фоновое задание для УправляемыеФормы_Вариант2 Процедура ФоновыйПроцесс(Адрес) Экспорт КоличествоОбходов = 100500; Для Инд = 0 По КоличествоОбходов Цикл //такая вот нехитрая эмуляция длительной операции ПоместитьВоВременноеХранилище( Новый Структура("Инд,КоличествоОбходов", Инд,КоличествоОбходов), Адрес); КонецЦикла; КонецПроцедуры
Рисунок 6. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Общий модуль

Для тех, кто захочет проверить работоспособность данного примера, дополнительно приведём скриншот формы обработки:

Рисунок 7. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Форма обработки

Несмотря на то, что индикатор будет «живым», сказать, что эффект достигнут и пример рабочий, на сто процентов нельзя. Потому что между реальным состоянием выполнения процесса и интерфейсом пользователя есть аж целых две «прослойки» – временное хранилище и обработчик ожидания. При таком подходе мало того, что отображение идёт не в режиме реального времени, так ещё и возрастает возможность возникновения различного вида сбоев из-за использования промежуточных звеньев.

Подводя итог получаем, что для «правильной» работы индикатора в управляемых формах (то есть, как в обычном режиме – с привязкой к выполнению процесса в реальном времени) не хватает возможности инициировать сервером отправку данных на сторону клиентской части. И тут наступает самое время поговорить про сюрприз, который фирма «1С» преподнесла разработчикам в новой платформе «8.3.10».

Платформа «8.3.10»

На самом деле в платформе «1С:Предприятие 8.3.10» касательно индикатора ровным счётом ничего не изменилось. Там есть много других интересных «фишек». Например, система взаимодействий, инкрементальная выгрузка конфигурации в XML, новые режимы основного окна. Но всё это не относится к теме данной статьи. Поэтому, можно было бы уже закончить писать… Если бы не наши «пытливые умы».

Давайте чуть-чуть пристальнее взглянем на систему взаимодействий. Для этого возьмём описание с одного из сайтов фирмы «1С»:

Система взаимодействия – это механизм, позволяющий пользователям одной информационной базы системы «1С:Предприятие» общаться друг с другом в режиме реального времени с помощью текстовых сообщений и видеозвонков… Обмен сообщениями между клиентской частью и сервером взаимодействия осуществляется по протоколу WebSocket.

Теперь посмотрим на определение протокола WebSocket на сайте Википедии:

WebSocket – протокол полнодуплексной связи, предназначенный для обмена сообщениями между клиентом и веб-сервером в режиме реального времени…

Обратите внимание на ключевые слова: двухсторонняя связь между клиентом и сервером в режиме реального времени! То, чего так не хватало для нормального функционирования индикатора в управляемых формах! Давайте для лучшего понимания взглянем на схему работы «1С:Предприятие» и системы взаимодействий:

Рисунок 8. Схема работы «1С:Предприятие» с системой взаимодействий

Остаётся вопрос: можно ли использовать систему взаимодействий для вывода хода выполнения процесса в индикатора? Ответ – можно конечно, но… Давайте сначала рассмотрим возможность информирования пользователя о ходе выполнения длительного процесса при помощи только системы взаимодействия.

Для этого нам потребуется длительный процесс, выполняемый в фоне:

&НаСервере Функция КомандаВыполнитьНажатиеНаСервере() ФоновыеЗадания.Выполнить("ОбщийМодуль1.ОбработатьФоновоеЗадание"); КонецФункции &НаКлиенте Процедура КомандаВыполнитьНажатие(Команда) //стартуем выполнение длительной операции на сервере в фоновом задании КомандаВыполнитьНажатиеНаСервере(); КонецПроцедуры
Рисунок 9. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Модуль формы обработки
//Фоновое задание для СистемаВзаимодействий Процедура ОбработатьФоновоеЗадание() Экспорт Для Инд = 0 По 100500 Цикл //такая вот не хитрая эмуляция длительной операции КонецЦикла; КонецПроцедуры
Рисунок 10. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Общий модуль

Который мы дополним программным кодом работы с системой взаимодействия, достаточным для информирования пользователя о ходе выполнения процедуры в виде оповещений. Для этого нам будет необходимо немного изменить процедуру обработки фонового задания в общем модуле:

//Фоновое задание для СистемаВзаимодействий Процедура ОбработатьФоновоеЗадание() Экспорт МенеджСВ = Новый МенеджерСистемыВзаимодействия; //создаём обсуждение, в которое будем сообщать о ходе выполнения Обсуждение = МенеджСВ.СоздатьОбсуждение(); Обсуждение.Заголовок = "Служебное"; Обсуждение.Участники.Добавить(МенеджСВ.ИдентификаторТекущегоПользователя()); Обсуждение.Записать(); Для Инд = 0 По 100500 Цикл //такая вот нехитрая эмуляция длительной операции //отправляем сообщение только один раз в 250 обходов цикла Если Инд%250 = 0 Тогда //подготовка и отправка сообщения Сообщ = МенеджСВ.СоздатьСообщение(Обсуждение.Идентификатор); УстановитьПривилегированныйРежим(Истина); Сообщ.Автор = МенеджСВ.ИдентификаторТекущегоПользователя(); Сообщ.Дата = ТекущаяДата(); Сообщ.Текст = "Выполнение: " + Строка(Инд*100/100500) + "%"; Попытка Сообщ.Записать(); Исключение КонецПопытки; УстановитьПривилегированныйРежим(Ложь); КонецЕсли; КонецЦикла; КонецПроцедуры
Рисунок 11. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Общий модуль

Если изучить программный код, то будет понятно – в момент старта фонового задания создаётся «Обсуждение», в котором будет выводится информация о ходе процесса. А при выполнении длительного процесса в «Обсуждение» выводятся сообщения с указанием процента выполнения. Каков будет результат и где его искать – видно на следующем рисунке:

Рисунок 12. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Пример работы

Таким образом, у пользователя будет возможность увидеть процент выполнения фонового задания в режиме реального времени. Если он знает, куда смотреть.

С точки зрения эргономики данный вариант проигрывает выводу информации в виде индикатора на самой форме обработки. Поэтому при желании к описанному механизму можно «прикрутить» и индикатор. Но! Пока это возможно сделать только при помощи подключенного обработчика ожидания, который инициирует серверный вызов для анализа полученных сообщений и вывода данных в индикатор.

&НаКлиенте Процедура ОбработчикОжидания() Экспорт Вывод_В_Индикатор() КонецПроцедуры // ВыводПрогрессора() &НаСервере Процедура Вывод_В_Индикатор() МенеджСВ = Новый МенеджерСистемыВзаимодействия; ОтборСВ = Новый ОтборСообщенийСистемыВзаимодействия; ОтборСВ.Количество = 1; ОтборСВ.НаправлениеСортировки = НаправлениеСортировки.Убыв; ОтборОбсужд = Новый ОтборОбсужденийСистемыВзаимодействия; ОтборОбсужд.КонтекстноеОбсуждение = Ложь; ВсеОбсуждения = МенеджСВ.ПолучитьОбсуждения(ОтборОбсужд); Для Каждого ТекОбсуждение Из ВсеОбсуждения Цикл Если ТекОбсуждение.Заголовок = "Служебное" Тогда Прервать; КонецЕсли; КонецЦикла; ОтборСВ.Обсуждение = ТекОбсуждение.Идентификатор; ВсеСообщения = МенеджСВ.ПолучитьСообщения(ОтборСВ); Если ВсеСообщения.Количество() > 0 Тогда Сообщение = ВсеСообщения[0]; Иначе Возврат; КонецЕсли; ЗначениеПроцента = СтрЗаменить(Сообщение.Текст,"Выполнение: ",""); ЗначениеПроцента = СтрЗаменить(ЗначениеПроцента,"%",""); Попытка ЗначениеПроцента = Число(СокрЛП(ЗначениеПроцента)); Исключение Возврат; КонецПопытки; Индикатор = ЗначениеПроцента; КонецПроцедуры
Рисунок 13. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в индикатор. Процедуры обработчика ожидания

Конечно, это очередное использование промежуточного звена, неоправданные серверные вызовы и как следствие – запоздание отображения от режима реального времени.

Связано это с тем, что некоторые методы работы с системой взаимодействия не доступны на клиенте. Но это будет меняться, и разработчики платформы «1С:Предприятие» уже анонсировали, что в версии 8.3.11 на основе системы взаимодействий появится возможность инициирования сервером передачи информации на сторону клиента!

Вместо заключения

В настоящее время эргономика инструмента играет большую роль в дальнейшей его судьбе – будет оно активно использоваться/применяться или его отложат/выкинут.

И если раньше достаточно было показать пользователю куда/какие вводить данные в программе и где/какой он от этого будет видеть результат, то сейчас важно – удобно ли эти данные вносить и как быстро можно получить обратную связь.

Скорость реакции программы на действия пользователя тоже выходит на первый план. Даже минимальное ожидание отклика начинает вызывать раздражение, а задержка в обратной связи, длящаяся даже всего несколько секунд, может стать поводом к аварийному завершению работы приложения.

Поэтому при разработке конфигураций необходимо обращать внимание на программный код, выполнение которого может занять продолжительное время. И предусматривать механизмы оповещения пользователя о том, что программа выполняет процесс, а не зависла.

Конечно, не всегда представляется возможным в начале длительной операции предвидеть объем обрабатываемых данных или время выполнения операции. В этих случаях использование индикатора не будет давать пользователю достоверной информации о ходе процесса и его использование становится нецелесообразным. Поэтому порой приходится выкручиваться различными способами, чтобы работа в программе вызывала меньше негативных эмоций – использовать анимированные кольца или милых котят.

Но если есть возможность получить привязку выполнения процесса к реальному времени, то это нужно делать и выводить пользователю эту полезную информацию. Согласитесь – ведь приятно иметь возможность прогнозировать “успею ли я сходить налить себе кофе, пока этот отчёт формируется”?

P.S.

Если вас заинтересовала система взаимодействий, и вы хотели бы попробовать с ней поработать, но не знаете, что это такое и с чего начать – читайте следующую статью Система взаимодействий в платформе 8.3.10.

А пока – пишите в комментариях истории из своего опыта по работе с индикаторами!

Об авторе

Автор статьи – Павел Ванин

г. Владимир

E-mail: pahich@mail.ru

Выгрузка ИБ с примерами и PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.


Статья в PDF-форматеСтатья в PDF-формате
Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)
Выгрузка ИБ с примерами:Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Комментарии / обсуждение (54):

    • Pahich

      Добрый день!

      Скачал, запустил под первой попавшейся платформой 8.3.16.1148.
      Работает все, но как и обозначено в статье – есть нюансы.
      1. Для работы первого варианта необходимо запустить 1С в режиме обычного приложения.
      2. Работает в тонком клиенте (управляемое приложение).
      3. Работает в тонком клиенте (управляемое приложение).
      4. Для работы этого варианта, необходимо чтобы тестовая конфигурация была подключена к серверу взаимодействий.

      • Артем Рогов

        3. Работает в тонком клиенте (управляемое приложение).
        Третий вариант.
        При нажатии кнопки система не реагирует, отладчик до индикатора вообще доходит.

        https://yadi.sk/i/4nlXAM2eibHNfA

        • Pahich

          Добрый день!

          Проверял на файловой базе, работает. Там установлена задержка 5 секунд. Попробуйте подождать дольше.

          Если у вас серверная база, то вероятно в ней работать не будет. В комментариях вроде это обсуждалось.

    • Виктор Левченко

      Вообще-то с функцией индикатора успешно справляется механизм “Состояние”
      Глобальный контекст (Global context)
      Состояние (Status)
      Синтаксис:
      Состояние(, , , )
      Параметры:
      (необязательный)
      Тип: Строка.
      Строка, предназначенная для вывода в панель состояния. Если параметр не указан, возобновляется вывод системного текста в панель состояния.
      (необязательный)
      Тип: Число.
      Значение индикатора прогресса (от 1 до 100).
      Если не задан, индикатор прогресса не отображается.
      (необязательный)
      Тип: Строка.
      Текст пояснения.
      (необязательный)
      Тип: Картинка.
      Картинка.
      Описание:
      Выводит текст в панель состояния.
      Доступность:
      Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
      Примечание:
      Для режима запуска ОбычноеПриложение используется только параметр , а вывод текста осуществляется в панель состояния.

      • Pahich

        Добрый день, Виктор!

        Спасибо за внимание к моей статье!

        Статья рассказывает о способах передачи информации с сервера на клиент. И в качестве примера была выбрана задача вывода индикации о выполнении операции. Предложенный вами метод “Состояние” при использовании 1С в режиме управляемого приложения не решает эту задачу.

        Если же говорить про способ вывода информации на экран, то это дело “вкусовщины”. Кому-то нравятся прогресс-бары, кому-то значения процентов, кто-то хочет видеть отдельную форму с котиками, а кому-то достаточно вывода информации в форму/панель состояния.

  1. Сергей

    Способ с использованием хранилища, описанный в статье, устарел.
    Цитата из СП: «Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания.»

    • Pahich

      Добрый день, Сергей!

      Да, это так! В статье описан самый прогрессивный способ информирования – через систему взаимодействия.

      Есть еще вариант с использованием БСП, но это механизм библиотеки, а не платформы. Поэтому в данной статье не рассматривался )

  2. ЛевS

    Костылище неимоверный с кучей ограничений
    1) Не всегда работает
    2)Менять базу нельзя, общие модули исключаются
    3)Размер передаваемых данных не больше гигабайта
    4)Проблемы с возвратом данных …
    и т.д.
    Неудачная идея…

    • Павел Ванин

      ЛевS, спасибо за комментарий! )

      Скажите пожалуйста – это вопросы? Или мнение? Если мнение, то про статью? Или про механизм? =)

      • ЛевS

        Вопрос, как сделать попроще, без импользования ОМ, чтобы обработка не была привязана к конкретной базе – эргономику, конечно, дорабатывать надо… А, статья отличная! Хорошая работа проведена… Но, увы, это решение с фоновыми заданиямиработает только в общих модулях

      • ЛевS

        А костылище – я имел в виду убогий механизм клиент – серверного взаимодействия 1С. И, дорабатывать не собираются, по – ходу… Могли бы индикатор сделать отдельным асинхронным объектом(типа диалога), который бы перерисовывался независимо, как в нормальных клиент – серверных системах. Потому что, как верно отмечено в данной теме, эргономика – очень большое влияние имеет на судьбу приложений, а, прогрессбар весьма востребованный элемент…

        • Павел Ванин

          ЛевS, Спасибо за развернутый ответ! )

          По поводу вывода прогресс-бара без привязки к ИБ: в типовых конфигурациях на основе БСП есть возможность использовать механизм длительных операций, который позволяет выполнять длительные операции даже из внешних обработок:


          ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне(“ДополнительныеОтчетыИОбработки.ВыполнитьКоманду”, ПараметрыКоманды, ПараметрыВыполнения);


          ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
          ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
          ПараметрыОжидания.Интервал = 1;

          ДлительныеОперацииКлиент.ОжидатьЗавершение(
          ДлительнаяОперация,
          Новый ОписаниеОповещения(“ПослеВыполненияФоновогоЗадания”, ЭтаФорма),
          ПараметрыОжидания);

          А при помощи системы взаимодействия можно сделать и сервер-клиентский вызов, что решает много вопросов, в том числе вывода информации о прогрессе длительной операции )

          • ЛевS

            О, эта тема, наверно, подойдет… Надо будет посмотреть… Спасибо за подсказку, изучу, а, то, очень нужно. Клиенты перешли от обычных форм к УФ, раньше у них было все красиво – бежала полоска, ctrl+break был доступен, а, сейчас это все делается на стороне сервера и они очень страдают, а, страдание вымещают, соответственно, на нас))

  3. Дмитрий Богданов

    Можно в фоновом задании выдавать текущее состояние через метод Сообщить, например такие: “Текущий:7,Всего:100”. Далее, на клиенте периодически вызывать метод фонового задания ПолучитьСообщенияПользователю, из текста сообщения вытаскивать текущий процент.

    • Павел Ванин

      Дмитрий, согласен в том, что можно придумать еще варианты. Если есть возможность использовать методы, предоставляемые БСП, то можно использовать их.

      Но все они заключаются в том, что на сервере производится обработка и подготовка сообщений, а со стороны клиента происходит опрос сервера с некоторой периодичностью.

      Цель статьи – показать возможности нового инструмента (система взаимодействий), которые можно применять для отображения прогресса длительных операций.

  4. Владимир Насыров

    Все это конечно хорошо, но есть одно, но очень большое НО!
    Дело в том что система взаимодействий работает только в интерфейсе Такси.

  5. mavlad

    Попробовал вариант без сервера взаимодействий для управляемых форм – через ПоместитьВоВременноеХранилище:
    Работает как 0%, задержка и сразу 100%
    У вас именно прокрутку видно?
    Платформа 1С:Предприятие 8.3 (8.3.10.2309)

    • Pahich

      mavlad, добрый день! Расскажите подробнее – Вы тестируете пример, приложенный к статье? Или повторяете примеры самостоятельно? Файловый или клиент-серверный вариант работы 1С?

    • FatOFF

      На сколько я знаю, все что помещается во временное хранилище, во время выполнения фонового задания, будет доступно на стороне клиента инициализирующего это задание только после завершения этого фонового задания (если ничего не поменялось в платформе). По крайней мере раньше подобный метод представленный в статье не прокатил бы… В БСП используется другой метод, передача прогресса через сообщения пользователю (функции “СообщитьПрогресс” и “ПрочитатьПрогресс”) где в первой выводятся сообщения в структуре которая преобразуется XML строку, а во второй, через функцию фонового задания “ПолучитьСообщенияПользователю” получается и разбирается…

      Pahich
      В новых версия платформы все что помещаем во временной хранилище становится доступным на клиенте до завершения фонового задания? Или данный метод будет работать так как его описал mavlad

      • Pahich

        FatOFF, дело не в новых платформах, а скорее в “частных случаях”. В файловом варианте серверная часть является лишь эмуляцией. Похоже поэтому, временное хранилище является некой общей “сущностью”.
        Поэтому разобранные примеры являются концептуальными примерами, а не готовыми решениями.

        Продолжаем пользоваться механизмами БСП и ждем выхода 8.3.11! :)

  6. susserg

    Пользуюсь фоновым процессом, который периодически записывает состояние и процент выполнения в справочник. Обработчик ожидания на управляемой форме выводит информацию из справочника на форму. Достаточно эргономичное решение.

    • Pahich

      Интересное решение, спасибо!

      Вы создаете новый элемент справочника? Или обновляете значение реквизита?

  7. Роман

    5 лет пишу на сервере “сообщить” а на клиенте “получить сообщения пользователю”

  8. Роман

    Спасибо за статью, очень интересно. Но есть несколько вопросов, нужных для понимания сути. Для системы взаимодействия требуется установленный веб-сервер? Я так понял, все это взаимодействие ведется через сервис 1Cdialog.com? Или же в пределах работы в интрасети/локалхоста ничего подобного не требуется?

    • Pahich

      Роман, на момент написания статьи, все взаимодействие велось только через сервис 1Cdialog.com. Но сейчас уже опубликована “Версия для ознакомления” дистрибутива сервера взаимодействий для установки в локальной сети. Для операционной системы Windows есть установщик, который позволяет в автоматическом режиме установить все необходимые компоненты. С особенностями лицензирования стоит ознакомиться в информационном письме фирмы 1С №23353 от 24.08.2017.

  9. Dmitry_B

    Спасибо за статью, похоже в фирме 1С, что то поменялось (судя по выбранным направлениям развития).

  10. Дмитрий

    Хорошая статья. Но по части передачи сообщений с сервера, кроме описанных нестыковок, система взаимодействия как таковая начинает работать от 2+ пользователей, что опять не прибавляет оптимизма по части программной реализации долгих процессов с её помощью.

    • Pahich

      Дмитрий, пример в статье не для широкого использования. Исключительно для демонстрации возможностей нового механизма. Также статья нацелена на то, чтобы читатели задумались над «курсом» саморазвития, который надо брать в ближайшее время.

      А про 2+ пользователей – никто же не мешает Вам создать больше одного пользователя в базе и получить преимущества от использования сервера взаимодействий! :)

  11. Александр

    Хорошая статья.
    Но это извращение. с таким же успехом можно было бы в общую папку файл с процентом выполнения записывать.
    Отлаживать типовые конфигурации стало сложнее, когда все сделано через фоновые вызовы и обработки ожидания и оповещения

    • Pahich

      Александр, любая сложность – повод задуматься над извечным вопросом «не слишком ли медленно я двигаюсь вперед?» :)

      • Сергей

        Такие сложности и недоработки, которые придумывают чудо люди в фирме 1с зачастую шаг назад а не вперед!

        • Павел Ванин

          Сергей, добрый день!

          Можете пояснить чуть более подробно что Вы имеете в виду? : )

          • Иван

            Не прошло и года, а я хочу пояснить за Сергея:
            Что сложного 1сникам сделать возможность вызова клиента сервером. Ведь функция “Сообщить” по сути это уже как-то делает.

  12. TRM

    Нда… для меня реализация таким оригинальным методом будет слишком красивой. Хотел было прикрутить, но воздержусь. Возможно появится что-нибудь более традиционное.

    • Pahich

      Обязательно посмотрите платформу 8.3.11 – там как раз ожидается что-то «более традиционное» :)

  13. DEV1C

    При таком чатировании – будет расти размер базы из-за сохранённых сообщений месседжера. Хотя, это наверное только мое мнение!

    • Pahich

      DEV1C, система взаимодействий хранит данные на своей стороне. Да и объем текстовых данных не велик. В любом случае, приведенный пример подходит исключительно для целей тестирования и изучения новых возможностей. Так как в 8.3.11 разработчики обещают новые возможности.

  14. Максим

    Способ через метод “ПоместитьВоВременноеХранилище” работать не будет (выдержка из СП):
    “Данные, помещенные во временное хранилище в фоновом задании, не будут доступны из родительского сеанса до момента завершения фонового задания”

    • Pahich

      Максим, меня тоже удивила данная выдержка при наличии работоспособного кода.

      Пожалуй, стоит добавить, что в данной статье используются недокументированные возможности! Используйте их в своих разработках на свой страх и риск :)

    • Илья Низамов

      Отлично все работает, реализовал подобный вариант в мобильном приложении, правда вывод индикатора идет в html поле.

  15. gosn1ck

    спасибо за статью.
    1с – такой 1с… изначально систему взаимодействия придумали как чат, а теперь при помощи чата сделали обработку фоновых заданий. мне одному кажется что это звучит дико?

    • Pahich

      gosn1ck, спасибо Вам за уделенное статье внимание!

      Думаю, что в 1С давно зрел вопрос сервер-клиентского вызова. И (вероятно) система взаимодействий в первую очередь была реализована как его частный случай для сбора статистики. Не сомневаюсь, что данный механизм постепенно будет «обрастать» новыми возможностями.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

Я подтверждаю, что ознакомлен(а) с Пользовательским соглашением, принимаю его условия и даю свое согласие на обработку моих персональных данных.

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.